package com.lowca.news.dao;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;

import com.lowca.news.dao.support.Pager;

public interface BaseDao<T, PK extends Serializable> {

	/**
	 * 根据ID获取实体对象.
	 * 
	 * @param id
	 *            记录ID
	 * @return 实体对象
	 */
	public T get(PK id);

	/**
	 * 根据ID获取实体对象.
	 * 
	 * @param id
	 *            记录ID
	 * @return 实体对象
	 */
	public T load(PK id);

	/**
	 * 根据ID数组获取实体对象集合.
	 * 
	 * @param ids
	 *            ID对象数组
	 * 
	 * @return 实体对象集合
	 */
	public List<T> getAll(PK[] ids);

	/**
	 * 根据属性名和属性值获取实体对象.
	 * 
	 * @param propertyName
	 *            属性名称
	 * @param value
	 *            属性值
	 * @return 实体对象
	 */
	public T findUniqueByProperty(String propertyName, Object value);

	/**
	 * 根据属性名和属性值获取实体对象集合.
	 * 
	 * @param propertyName
	 *            属性名称
	 * @param value
	 *            属性值
	 * @return 实体对象集合
	 */
	public List<T> findByProperty(String propertyName, Object value);

	/**
	 * 获取所有实体对象集合.
	 * 
	 * @return 实体对象集合
	 */
	public List<T> findAll();

	/**
	 * 获取所有实体对象总数.
	 * 
	 * @return 实体对象总数
	 */
	public Long countAll();

	/**
	 * 根据属性名判断数据是否已存在.
	 * 
	 * @param propertyName
	 *            属性名称
	 * @param value
	 *            值
	 * @return boolean
	 */
	public boolean existByProperty(String propertyName, Object value);

	/**
	 * 保存实体对象.
	 * 
	 * @param entity
	 *            对象
	 * @return ID
	 */
	public PK save(T entity);

	/**
	 * 更新实体对象.
	 * 
	 * @param entity
	 *            对象
	 */
	public void update(T entity);

	/**
	 * 保存或者更新实体对象.
	 * 
	 * @param entity
	 *            对象
	 */
	public void saveOrUpdate(T entity);

	/**
	 * 删除实体对象.
	 * 
	 * @param entity
	 *            对象
	 * @return
	 */
	public void delete(T entity);

	/**
	 * 根据ID删除实体对象.
	 * 
	 * @param id
	 *            记录ID
	 */
	public void delete(PK id);

	/**
	 * 根据ID数组删除实体对象.
	 * 
	 * @param ids
	 *            ID数组
	 */
	public int deleteAll(PK[] ids);

	/**
	 * 删除集合中的所有对象
	 * 
	 * @param entities
	 */
	public void deleteAll(Collection<T> entities);

	/**
	 * 刷新session.
	 * 
	 */
	public void flush();

	/**
	 * 清除Session.
	 * 
	 */
	public void clear();

	/**
	 * 清除某一对象.
	 * 
	 * @param object
	 *            需要清除的对象
	 */
	public void evict(Object object);

	/**
	 * 根据分页参数和DetachedCriteria对象进行查询.
	 * 
	 * @param firstResult
	 * @param maxResults
	 * @param detachedCriteria
	 * @return
	 */
	public Pager<T> findPageByCriteria(final int pageNo, final int pageSize,
			final DetachedCriteria detachedCriteria);

	/**
	 * 根据hql对象进行统计
	 * 
	 * @param hql
	 * @param params
	 * @return
	 */
	public long countByHQL(final String hql, Object... params);

	/**
	 * 根据分页参数和hql对象进行查询
	 * 
	 * @param firstResult
	 * @param maxResults
	 * @param hql
	 * @param params
	 * @return
	 */
	public Pager<T> findPageByHQL(final int pageNo, final int pageSize,
			final String hql, Object... params);

	/**
	 * 根据HQL语句查找单个对象
	 * 
	 * @param hql
	 *            HQL语句
	 * @param params
	 *            参数
	 * @return
	 */
	public T findUniqueByHQL(String hql, Object... params);

}